﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace WBasicClassLib.IniByXml
{
    /// <summary>
    /// 对使用Xml文件作为存储载体的IniByXml文件进行读取操作
    /// IniByXml文件支持除根元素外的一维空间节点，对节点的描述使用属性来标明
    /// </summary>
    public class IniByXmlReader
    {
        #region 属性及成员变量

        /// <summary>
        /// 绑定的文件名
        /// </summary>
        private string _BindingFile;
        public string BindingFile
        {
            get
            {
                return _BindingFile;
            }
        }

        /// <summary>
        /// Xml文件读取的内存模型
        /// </summary>
        private XElement XmlReader;

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数，传入要读入的Xml文件名
        /// </summary>
        /// <param name="Filename">要读入的Xml文件名</param>
        public IniByXmlReader(string Filename)
        {
            _BindingFile = Filename;
            try
            {
                XmlReader = XElement.Load(_BindingFile);
            }
            catch
            {
            }
        }

        #endregion

        #region 方法

        /// <summary>
        /// 获得相应的Element节点
        /// </summary>
        /// <param name="ElementName">所要取得的Element的名称</param>
        /// <returns>配置文件中对应的XElement元素</returns>
        public XElement GetElement(string ElementName)
        {
            return XmlReader.Element(ElementName);
        }

        /// <summary>
        /// 获得指定XElement元素中相应的Attribute信息
        /// </summary>
        /// <param name="Elem">指定的XElement元素</param>
        /// <param name="AttributeName">指定的Attribute的名称</param>
        /// <returns>相应的Attribute的值</returns>
        public string GetAttribute(XElement Elem, string AttributeName)
        {
            return Elem.Attribute(AttributeName).Value;
        }

        /// <summary>
        /// 获得对指定XElement元素的描述
        /// </summary>
        /// <param name="Elem">指定的XElement元素</param>
        /// <returns>对该元素的描述</returns>
        public string GetDescription(XElement Elem)
        {
            return Elem.Value;
        }

        /// <summary>
        /// 获得文档中所有Element元素的集合
        /// </summary>
        /// <returns>文档中所有Element元素的IEnumerable集合</returns>
        public IEnumerable<XElement> GetAllElements()
        {
            return XmlReader.Elements();
        }

        /// <summary>
        /// 使用Lambda表达式或者委托提供条件来从Xml文档中选择元素
        /// </summary>
        /// <param name="selector">选择条件</param>
        /// <returns>符合条件的元素集合</returns>
        public List<XElement> GetElements(Func<XElement, bool> selector)
        {
            List<XElement> result = new List<XElement>();
            foreach(XElement elem in GetAllElements())
            {
                if (selector(elem))
                {
                    result.Add(elem);
                }
            }
            return result;
        }

        /// <summary>
        /// 更新元素信息项的属性值
        /// </summary>
        /// <param name="ElementName">元素名</param>
        /// <param name="AttributeName">元素的属性名</param>
        /// <param name="AttributeNewValue">要设置的新属性值</param>
        /// <returns>更新是否成功</returns>
        public bool UpdateAttribute(string ElementName, string AttributeName, string AttributeNewValue)
        {
            try
            {
                this.GetElement(ElementName).Attribute(AttributeName).Value = AttributeNewValue;
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 保存修改信息
        /// </summary>
        public void Save()
        {
            XmlReader.Save(_BindingFile);
        }

        #endregion
    }
}
